package com.example.xmhds_1.service.impl;

import com.example.xmhds_1.common.cache.UserAccountCacheManager;
import com.example.xmhds_1.entity.UserAccount;
import com.example.xmhds_1.entity.UserInfo;
import com.example.xmhds_1.mapper.account.UserAccountMapper;
import com.example.xmhds_1.service.UserAccountService;
import com.example.xmhds_1.service.UserInfoService;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;

/**
 * 用户账号服务实现类
 */
@Slf4j
@Service
public class UserAccountServiceImpl implements UserAccountService {

    @Autowired
    private UserAccountMapper userAccountMapper;

    @Autowired
    private UserInfoService userInfoService;

    @Autowired
    private UserAccountCacheManager userAccountCacheManager;

    private final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();

    /**
     * 用户登录
     * 验证用户名和密码是否匹配
     *
     * @param username 用户名
     * @param password 密码
     * @return 登录成功返回用户信息，失败返回null
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public UserAccount login(String username, String password) {

        //判断账号是否存在
        UserAccount user = userAccountCacheManager.findByUsername(username);
        if(user==null) {
            user=userAccountMapper.findByUsername(username);
            userAccountCacheManager.saveUserAccount(user);
        }
        if (user != null&&password!=null) {
            user.setPassword(password);
            //登入操作
            user=userAccountMapper.login(username,password);
            if (user!=null) {
                // 更新user_info表的更新时间
                UserInfo userInfo = userInfoService.getByAccountId(user.getId().toString());
                if (userInfo != null) {
                    userInfo.setUpdateTime(LocalDateTime.now());
                    userInfoService.updateUserInfo(userInfo);
                    //log.info("更新用户最后登录时间: username={}", username);
                }
            }

            user.setPassword(null);  // 清除密码
            return user;
        }
        return null;
    }

    /**
     * 用户注册
     * 创建新用户账号，包括：
     * 1. 检查用户名是否已存在
     * 2. 加密密码
     * 3. 设置初始状态和时间
     *
     * @param username 用户名
     * @param password 密码
     * @return 注册成功返回用户信息，失败返回null
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public UserAccount register(String username, String password) {
        // 检查用户名是否已存在
        if(userAccountCacheManager.findByUsername(username)!=null){
            return null;
        }
        if (userAccountMapper.checkUsernameExists(username)) {
            return null;
        }

        // 创建新用户
        UserAccount user = new UserAccount();
        user.setUsername(username);
        user.setPassword(passwordEncoder.encode(password));
        user.setStatus(1);
        user.setCreateTime(LocalDateTime.now());
        user.setUpdateTime(LocalDateTime.now());

        // 保存用户
        userAccountMapper.insert(user);
        //通过用户账号获取对应的信息
        user=userAccountMapper.findByUsername(username);
        //加载到缓存中
        userAccountCacheManager.saveUserAccount(user);
        // 创建用户信息
        userInfoService.createUserInfo(user.getId().toString(), username);

        // 清除密码后返回
        user.setPassword(null);
        return user;
    }
}
